home *** CD-ROM | disk | FTP | other *** search
- '\"
- '\" Copyright (c) 1993 The Regents of the University of California.
- '\" All rights reserved.
- '\"
- '\" Permission is hereby granted, without written agreement and without
- '\" license or royalty fees, to use, copy, modify, and distribute this
- '\" documentation for any purpose, provided that the above copyright
- '\" notice and the following two paragraphs appear in all copies.
- '\"
- '\" IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY
- '\" FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- '\" ARISING OUT OF THE USE OF THIS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
- '\" CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- '\"
- '\" THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
- '\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- '\" AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- '\" ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
- '\" PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- '\"
- '\" $Header: /user6/ouster/tcl/man/RCS/trace.n,v 1.3 93/06/16 16:36:39 ouster Exp $ SPRITE (Berkeley)
- '\"
- .\" The definitions below are for supplemental macros used in Tcl/Tk
- .\" manual entries.
- .\"
- .\" .HS name section [date [version]]
- .\" Replacement for .TH in other man pages. See below for valid
- .\" section names.
- .\"
- .\" .AP type name in/out [indent]
- .\" Start paragraph describing an argument to a library procedure.
- .\" type is type of argument (int, etc.), in/out is either "in", "out",
- .\" or "in/out" to describe whether procedure reads or modifies arg,
- .\" and indent is equivalent to second arg of .IP (shouldn't ever be
- .\" needed; use .AS below instead)
- .\"
- .\" .AS [type [name]]
- .\" Give maximum sizes of arguments for setting tab stops. Type and
- .\" name are examples of largest possible arguments that will be passed
- .\" to .AP later. If args are omitted, default tab stops are used.
- .\"
- .\" .BS
- .\" Start box enclosure. From here until next .BE, everything will be
- .\" enclosed in one large box.
- .\"
- .\" .BE
- .\" End of box enclosure.
- .\"
- .\" .VS
- .\" Begin vertical sidebar, for use in marking newly-changed parts
- .\" of man pages.
- .\"
- .\" .VE
- .\" End of vertical sidebar.
- .\"
- .\" .DS
- .\" Begin an indented unfilled display.
- .\"
- .\" .DE
- .\" End of indented unfilled display.
- .\"
- '\" # Heading for Tcl/Tk man pages
- .de HS
- .ds ^3 \\0
- .if !"\\$3"" .ds ^3 \\$3
- .if '\\$2'cmds' .TH \\$1 1 \\*(^3 \\$4
- .if '\\$2'lib' .TH \\$1 3 \\*(^3 \\$4
- .if '\\$2'tcl' .TH \\$1 n \\*(^3 Tcl "Tcl Built-In Commands"
- .if '\\$2'tk' .TH \\$1 n \\*(^3 Tk "Tk Commands"
- .if '\\$2'tclc' .TH \\$1 3 \\*(^3 Tcl "Tcl Library Procedures"
- .if '\\$2'tkc' .TH \\$1 3 \\*(^3 Tk "Tk Library Procedures"
- .if '\\$2'tclcmds' .TH \\$1 1 \\*(^3 Tk "Tcl Applications"
- .if '\\$2'tkcmds' .TH \\$1 1 \\*(^3 Tk "Tk Applications"
- .if t .wh -1.3i ^B
- .nr ^l \\n(.l
- .ad b
- ..
- '\" # Start an argument description
- .de AP
- .ie !"\\$4"" .TP \\$4
- .el \{\
- . ie !"\\$2"" .TP \\n()Cu
- . el .TP 15
- .\}
- .ie !"\\$3"" \{\
- .ta \\n()Au \\n()Bu
- \&\\$1 \\fI\\$2\\fP (\\$3)
- .\".b
- .\}
- .el \{\
- .br
- .ie !"\\$2"" \{\
- \&\\$1 \\fI\\$2\\fP
- .\}
- .el \{\
- \&\\fI\\$1\\fP
- .\}
- .\}
- ..
- '\" # define tabbing values for .AP
- .de AS
- .nr )A 10n
- .if !"\\$1"" .nr )A \\w'\\$1'u+3n
- .nr )B \\n()Au+15n
- .\"
- .if !"\\$2"" .nr )B \\w'\\$2'u+\\n()Au+3n
- .nr )C \\n()Bu+\\w'(in/out)'u+2n
- ..
- '\" # BS - start boxed text
- '\" # ^y = starting y location
- '\" # ^b = 1
- .de BS
- .br
- .mk ^y
- .nr ^b 1u
- .if n .nf
- .if n .ti 0
- .if n \l'\\n(.lu\(ul'
- .if n .fi
- ..
- '\" # BE - end boxed text (draw box now)
- .de BE
- .nf
- .ti 0
- .mk ^t
- .ie n \l'\\n(^lu\(ul'
- .el \{\
- .\" Draw four-sided box normally, but don't draw top of
- .\" box if the box started on an earlier page.
- .ie !\\n(^b-1 \{\
- \h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul'
- .\}
- .el \}\
- \h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul'
- .\}
- .\}
- .fi
- .br
- .nr ^b 0
- ..
- '\" # VS - start vertical sidebar
- '\" # ^Y = starting y location
- '\" # ^v = 1 (for troff; for nroff this doesn't matter)
- .de VS
- .mk ^Y
- .ie n 'mc \s12\(br\s0
- .el .nr ^v 1u
- ..
- '\" # VE - end of vertical sidebar
- .de VE
- .ie n 'mc
- .el \{\
- .ev 2
- .nf
- .ti 0
- .mk ^t
- \h'|\\n(^lu+3n'\L'|\\n(^Yu-1v\(bv'\v'\\n(^tu+1v-\\n(^Yu'\h'-|\\n(^lu+3n'
- .sp -1
- .fi
- .ev
- .\}
- .nr ^v 0
- ..
- '\" # Special macro to handle page bottom: finish off current
- '\" # box/sidebar if in box/sidebar mode, then invoked standard
- '\" # page bottom macro.
- .de ^B
- .ev 2
- 'ti 0
- 'nf
- .mk ^t
- .if \\n(^b \{\
- .\" Draw three-sided box if this is the box's first page,
- .\" draw two sides but no top otherwise.
- .ie !\\n(^b-1 \h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c
- .el \h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c
- .\}
- .if \\n(^v \{\
- .nr ^x \\n(^tu+1v-\\n(^Yu
- \kx\h'-\\nxu'\h'|\\n(^lu+3n'\ky\L'-\\n(^xu'\v'\\n(^xu'\h'|0u'\c
- .\}
- .bp
- 'fi
- .ev
- .if \\n(^b \{\
- .mk ^y
- .nr ^b 2
- .\}
- .if \\n(^v \{\
- .mk ^Y
- .\}
- ..
- '\" # DS - begin display
- .de DS
- .RS
- .nf
- .sp
- ..
- '\" # DE - end display
- .de DE
- .fi
- .RE
- .sp .5
- ..
- .HS trace tcl
- .BS
- '\" Note: do not modify the .SH NAME line immediately below!
- .SH NAME
- trace \- Monitor variable accesses
- .SH SYNOPSIS
- \fBtrace \fIoption\fR ?\fIarg arg ...\fR?
- .BE
-
- .SH DESCRIPTION
- .PP
- This command causes Tcl commands to be executed whenever certain operations are
- invoked. At present, only variable tracing is implemented. The
- legal \fIoption\fR's (which may be abbreviated) are:
- .TP
- \fBtrace variable \fIname ops command\fR
- Arrange for \fIcommand\fR to be executed whenever variable \fIname\fR
- is accessed in one of the ways given by \fIops\fR. \fIName\fR may
- refer to a normal variable, an element of an array, or to an array
- as a whole (i.e. \fIname\fR may be just the name of an array, with no
- parenthesized index). If \fIname\fR refers to a whole array, then
- \fIcommand\fR is invoked whenever any element of the array is
- manipulated.
- .RS
- .LP
- \fIOps\fR indicates which operations are of interest, and consists of
- one or more of the following letters:
- .RS
- .TP
- \fBr\fR
- Invoke \fIcommand\fR whenever the variable is read.
- .TP
- \fBw\fR
- Invoke \fIcommand\fR whenever the variable is written.
- .TP
- \fBu\fR
- Invoke \fIcommand\fR whenever the variable is unset. Variables
- can be unset explicitly with the \fBunset\fR command, or
- implicitly when procedures return (all of their local variables
- are unset). Variables are also unset when interpreters are
- deleted, but traces will not be invoked because there is no
- interpreter in which to execute them.
- .RE
- .LP
- When the trace triggers, three arguments are appended to
- \fIcommand\fR so that the actual command is as follows:
- .DS C
- \fIcommand name1 name2 op\fR
- .DE
- \fIName1\fR and \fIname2\fR give the name(s) for the variable
- being accessed: if the variable is a scalar then \fIname1\fR
- gives the variable's name and \fIname2\fR is an empty string;
- if the variable is an array element then \fIname1\fR gives the
- name of the array and name2 gives the index into the array;
- if an entire array is being deleted and the trace was registered
- on the overall array, rather than a single element, then \fIname1\fR
- gives the array name and \fIname2\fR is an empty string.
- \fIOp\fR indicates what operation is being performed on the
- variable, and is one of \fBr\fR, \fBw\fR, or \fBu\fR as
- defined above.
- .LP
- \fICommand\fR executes in the same context as the code that invoked
- the traced operation: if the variable was accessed as part of a
- Tcl procedure, then \fIcommand\fR will have access to the same
- local variables as code in the procedure. This context may be
- different than the context in which the trace was created.
- If \fIcommand\fR invokes a procedure (which it normally does) then
- the procedure will have to use \fBupvar\fR or \fBuplevel\fR if it
- wishes to access the traced variable.
- Note also that \fIname1\fR may not necessarily be the same as the name
- used to set the trace on the variable; differences can occur if
- the access is made through a variable defined with the \fBupvar\fR
- command.
- .LP
- For read and write traces, \fIcommand\fR can modify
- the variable to affect the result of the traced operation.
- If \fIcommand\fR modifies the value of a variable during a
- read or write trace, then the new value will be returned as the
- result of the traced operation.
- The return value from \fIcommand\fR is ignored except that
- if it returns an error of any sort then the traced operation
- also returns an error with
- .VS
- the same error message returned by the trace command
- .VE
- (this mechanism can be used to implement read-only variables, for
- example).
- For write traces, \fIcommand\fR is invoked after the variable's
- value has been changed; it can write a new value into the variable
- to override the original value specified in the write operation.
- To implement read-only variables, \fIcommand\fR will have to restore
- the old value of the variable.
- .LP
- While \fIcommand\fR is executing during a read or write trace, traces
- on the variable are temporarily disabled.
- This means that reads and writes invoked by
- \fIcommand\fR will occur directly, without invoking \fIcommand\fR
- (or any other traces) again.
- .VS
- However, if \fIcommand\fR unsets the variable then unset traces
- will be invoked.
- .VE
- .LP
- When an unset trace is invoked, the variable has already been
- deleted: it will appear to be undefined with no traces.
- If an unset occurs because of a procedure return, then the
- trace will be invoked in the variable context of the procedure
- being returned to: the stack frame of the returning procedure
- will no longer exist.
- Traces are not disabled during unset traces, so if an unset trace
- command creates a new trace and accesses the variable, the
- trace will be invoked.
- .VS
- Any errors in unset traces are ignored.
- .VE
- .LP
- If there are multiple traces on a variable they are invoked
- in order of creation, most-recent first.
- If one trace returns an error, then no further traces are
- invoked for the variable.
- If an array element has a trace set, and there is also a trace
- set on the array as a whole, the trace on the overall array
- is invoked before the one on the element.
- .LP
- Once created, the trace remains in effect either until the
- trace is removed with the \fBtrace vdelete\fR command described
- below, until the variable is unset, or until the interpreter
- is deleted.
- Unsetting an element of array will remove any traces on that
- element, but will not remove traces on the overall array.
- .LP
- This command returns an empty string.
- .RE
- .TP
- \fBtrace vdelete \fIname ops command\fR
- If there is a trace set on variable \fIname\fR with the
- operations and command given by \fIops\fR and \fIcommand\fR,
- then the trace is removed, so that \fIcommand\fR will never
- again be invoked.
- Returns an empty string.
- .TP
- \fBtrace vinfo \fIname\fR
- Returns a list containing one element for each trace
- currently set on variable \fIname\fR.
- Each element of the list is itself a list containing two
- elements, which are the \fIops\fR and \fIcommand\fR associated
- with the trace.
- If \fIname\fR doesn't exist or doesn't have any traces set, then
- the result of the command will be an empty string.
-
- .SH KEYWORDS
- read, variable, write, trace, unset
-